package com.gin.retrofit.interceptor

import com.gin.retrofit.annotation.Join
import okhttp3.Interceptor
import okhttp3.Response
import retrofit2.Invocation
import retrofit2.http.Query

/**
 * 修改集合类的形参的实现方式, 当同时存在 [Query] 和 [Join] 注解时，将移除 [Query] 指定的所有同名字段，并将其值使用 [Join] 指定的分隔符连接后传入
 * @author BX-Gin
 * @since 2024/3/13 11:41
 */
class CollectionParameterInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()
        // 获取retrofit创建Request时在tag中保存的被调用的方法, 如果没获取到则直接返回
        val method = request.tag(Invocation::class.java)?.method() ?: return chain.proceed(request)

        val newBuilder = request.url.newBuilder()
        // 筛选出有 join注解的形参
        for (parameter in method.parameters) {
            // 从形参上获取注解
            val query = parameter.annotations.find { it is Query } as Query?
            val join = parameter.annotations.find { it is Join } as Join?
            // 参数key
            val key = query?.value
            // 分隔符
            val separator = join?.value
            // 两个注解同时存在时，替换原参数
            if (key != null && separator != null) {
                val values = request.url.queryParameterValues(key)
                newBuilder.removeAllQueryParameters(key)
                newBuilder.addQueryParameter(key, values.joinToString(separator))
            }
        }

        return chain.proceed(request.newBuilder().url(newBuilder.build()).build())
    }
}